/*
 * @Description: axios中间件（初始化和全局配置）
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2020-08-06 13:16:24
 * @LastEditTime: 2025-06-07 13:32:46
 */
import { ElMessage } from "element-plus";
import qs from "qs";
import axios from "axios";
// import PageLoading from './PageLoading'
import { useGetters, useUserStore } from "@/store";
import { TOKEN_OPTIONS, ContentType } from "settings";
import { JsonToFormData } from "./common";

//初始化
const Axios: any = axios.create({
  baseURL: __BASE_API__, //api路径
  withCredentials: true, // 跨域时允许设置cookie
  timeout: 10000, //超时
});

// token
let Token: string;

//请求前钩子
Axios.interceptors.request.use(
  (config: any) => {
    // 加载loading
    // PageLoading.show()
    // 由于执行请求时token可能已经改变，故每次请求前都要重新获取token
    Token = useGetters().getToken;
    // 判断是否存在token，如果存在的话，则每个http header都加上token
    Token && (config.headers[TOKEN_OPTIONS.key] = Token);

    // 数据格式动态处理，默认不处理为application/json
    if (config.data instanceof FormData) {
      config.headers["Content-Type"] = ContentType.FormData;
    } else if (config.contentType === "urlencoded") {
      config.data = qs.stringify(config.data); // 转换为urlencoded
      config.headers["Content-Type"] = ContentType.Urlencoded;
    }

    // 如果Content-Type被设置为multipart/form-data，而数据本身是json,则转换为formData
    if (
      config.headers["Content-Type"] === ContentType.FormData &&
      !(config.data instanceof FormData)
    ) {
      config.data = JsonToFormData(config.data);
    }

    return config;
  },
  (error: any) => {
    // PageLoading.hide() // 关闭loading
    console.error("[Request error]: " + error);
  }
);

//响应后钩子
Axios.interceptors.response.use(
  (response: any) => {
    // console.log('response', response)
    // 关闭loading
    // PageLoading.hide()

    // 对响应数据做些事
    if (response.status !== 200 || !response.data.ok) {
      ElMessage.error(response.data.msg);
      console.error("[Request error]: " + response.data.msg);
    } else if (typeof response.data === "string") {
      try {
        response.data = JSON.parse(response.data);
      } catch (error) {
        console.error("[JSON-Parse error]: " + error);
      }
    }

    // 更新token
    const newToken = response.headers[TOKEN_OPTIONS.key];
    if (newToken && newToken !== Token) {
      useUserStore().setToken(newToken);
    }

    return response.data;
  },
  (error: any) => {
    // PageLoading.hide() // 关闭loading

    // 代码层面出错
    if (!error.response) {
      const msg = error.toString();
      ElMessage.error(msg); //错误提示
      console.error("[Request error]: " + error);
      return { status: 0, msg };
    }
    // 后端返回异常
    const { status, data, statusText } = error.response;
    // 若这里响应码为403，则改变登陆状态，弹出登录框
    if (status === 403) {
      useUserStore().LoginInvalid();
    }
    setTimeout(() => {
      if (status === 404) {
        ElMessage.error(
          `${status}: ${statusText}（${error.response.config.url}）`
        ); //错误提示
      } else {
        ElMessage.error(data.msg); //错误提示
      }
    }, 100);
    return data;
  }
);

export default Axios;
